﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TPDiseño.Clases_de_Entidad;
using TPDiseño.DTO_s;
using DAO;

namespace TPDiseño.Clases_de_Control
{
    
    public class Gestor_Cuestionario
    {
        // Atributos
        //--------------------------------------------------------------------
        // Dependencia con DAO's
        private DAOCuestionario miDAOCuestionario = DAOCuestionario.Instance;

        public Estado cambiarEstado(string eststring)
        {
            Clases_de_Entidad.Estado est = new Estado();
            DAO.DAOEstado daoEst = new DAOEstado();
            switch (eststring)
            { 
                case "COMPLETO":
                    est = daoEst.cargar(5);
                        break;
                case "SIN CONTESTAR":
                        est = daoEst.cargar(3);
                        break;
                case "INCOMPLETO":
                        est = daoEst.cargar(4);
                        break;
                case "EN PROCESO":
                        est = daoEst.cargar(2);
                    break;
                    
            }
            

            return est;
        }



        public Cuestionario calcularpuntaje(Cuestionario cuestionario)
        {
            int ponderacioncompetencia;
            int ponderacionfactor = 0;
            

            foreach (H_competencia hcomp in cuestionario._competencias)
            {

                ponderacioncompetencia = 0;
                foreach (H_factor hfac in hcomp._factores)
                {
                    ponderacionfactor = 0;
                    foreach (H_pregunta hpreg in hfac._preguntas)
                    {
                        foreach (H_respuesta hresp in hpreg._respuestas)
                        {
                            if (hresp._orden_visualizacion == hpreg._op_respondida)
                            {
                                ponderacionfactor += hresp._ponderacion;
                            }
                        }
                    }

                    ponderacionfactor = ponderacionfactor / 5;
                    ponderacioncompetencia += ponderacionfactor;
                }
                hcomp._ponderacionobtenida = ponderacioncompetencia / hcomp._factores.Count;

            }



            return cuestionario;
        }
        public List<DTO_s.DTOCuest> buscar(Evaluacion ev)
        {
            
            DAO.DAOCuestionario DAOCuest = new DAOCuestionario();
            List<DTO_s.DTOCuest> DTOCuest_Coleccion = new List<DTO_s.DTOCuest>();
            
            
            //trae la coleccion de cuestionarios relacionados a la evaluacion
            List<Clases_de_Entidad.Cuestionario> cuestCol = DAOCuest.cargar(ev);
              foreach (Clases_de_Entidad.Cuestionario cuest in cuestCol)
            {
                //armo el DTOCuest
                DTO_s.DTOCuest DTOCuest = new DTOCuest();
                int puntaje;
                int suma = 0;
                int desaprobado = 0;

                DTOCuest._candidato = cuest._candidato;
                DTOCuest._cod_evaluacion = ev._cod_evaluacion;

                //filtro cuestionarios incompletos y desaprobados, calculo el puntaje
                foreach (Clases_de_Entidad.H_competencia comp in cuest._competencias)
                {
                    if (comp._ponderacionobtenida < comp._ponderacionrequerida)
                    {
                        desaprobado = desaprobado + 1;
                    }

                    suma = suma + comp._ponderacionobtenida;

                }
                                                
                puntaje = (suma / cuest._competencias.Count()); // CALCULO PUNTAJE

               if ((cuest._estado._estado == "ACTIVO") || (cuest._estado._estado == "SIN CONTESTAR"))
               {
                   DTOCuest._estado = "NUNCA INGRESÓ";
                   DTOCuest._puntaje = -1;
                   DTOCuest._cant_accesos = "";
                   DTOCuest._fecha_inicio = "";
                   DTOCuest._fecha_fin = "";
                   DTOCuest._ultimo_acceso = "";
               }
               if ((cuest._estado._estado == "EN PROCESO") || (cuest._estado._estado == "INCOMPLETO"))
               {
                   DTOCuest._estado = "INCOMPLETO";
                   DTOCuest._puntaje = -1;
                   DTOCuest._cant_accesos = cuest._cant_accesos.ToString();
                   DTOCuest._ultimo_acceso = cuest._ultimo_acceso.ToString();
                   DTOCuest._fecha_inicio = ev._fecha_inicio.ToString();
                   DTOCuest._fecha_fin = "";
               }
               if (cuest._estado._estado == "COMPLETO")
               {
                   if (desaprobado == 0)
                   {
                       DTOCuest._estado = "APROBADO";
                       DTOCuest._puntaje = puntaje;
                       DTOCuest._cant_accesos = cuest._cant_accesos.ToString();
                       DTOCuest._fecha_inicio = ev._fecha_inicio.ToString();
                       DTOCuest._fecha_fin = ev._fecha_fin.ToString();
                       DTOCuest._ultimo_acceso = "";
                   }
                   else 
                   {
                       DTOCuest._estado = "DESAPROBADO";
                       DTOCuest._puntaje = puntaje;
                       DTOCuest._cant_accesos = cuest._cant_accesos.ToString();
                       DTOCuest._fecha_inicio = ev._fecha_inicio.ToString();
                       DTOCuest._fecha_fin = ev._fecha_fin.ToString();
                       DTOCuest._ultimo_acceso = "";


                   }
               }
               

                //agrega el DTOCuest a DTOCuest_Coleccion
                DTOCuest_Coleccion.Add(DTOCuest);

            }

              return DTOCuest_Coleccion;
        
        }

        public Clases_de_Entidad.Cuestionario buscarCuestAct_EnProc(Candidato candidato, string clave)
        {
            List<Cuestionario> cuestionario_coleccion;
            DAOCuestionario DAOCuest = new DAOCuestionario();
            Cuestionario cuest_activo = new Cuestionario();

            //busca en el DAO los cuestionaris de candidato
            cuestionario_coleccion = DAOCuest.cargar(candidato._id);

            if (cuestionario_coleccion != null)
            {
                //busca el cuest activo o en proceso
                cuest_activo = obtenerAct_EnProc(cuestionario_coleccion, clave);
                if (cuest_activo._candidato != null)
                {
                    cuest_activo.sumarAcceso(); //suma un acceso
                    
                    //Inserta el cuestionario en la BD mediante un actualizar(cuest_activo) al DAO
                    DAOCuest.Actualizar(cuest_activo);
                }
            }
            
            return cuest_activo;
        }
        public Cuestionario guardarCuestionario(Cuestionario cuestionario)
        {
            DAOCuestionario daocuest = new DAOCuestionario();



            daocuest.Actualizar(cuestionario);
            foreach (Cuestionario cues in daocuest.cargar(cuestionario._candidato._id))
            {
                if (cuestionario._cod_cuestionario == cues._cod_cuestionario )
                {
                    cuestionario = cues;
                }
            }
           
            return  cuestionario;

        }

        public string cargarUsuario(Cuestionario cuest)
        {
            string usuario;
            DAOCandidato daocand = new DAOCandidato();
            Clases_de_Entidad.Candidato cand = new Candidato();

            cand = daocand.cargar(cuest._candidato._id);
            usuario = cand._nombre + " " + cand._apellido;
            return usuario;
            
        }
        public Cuestionario obtenerAct_EnProc(List<Cuestionario> cuestionario_coleccion, string clave)
        {
            Cuestionario cuest_activo = new Cuestionario();
            foreach (Cuestionario cuest in cuestionario_coleccion)
            {
                if (cuest._estado._estado == "ACTIVO" || cuest._estado._estado == "EN PROCESO")
                {
                    if (cuest._clave == clave)
                    {
                        cuest_activo = cuest;
                    }
                }

            }
            return cuest_activo;
        }
        public List<Cuestionario> cargar(List<Candidato> unosCandidatos)
        {
            // Retorno cuestionarios de los candidatos 
            return miDAOCuestionario.cargar(unosCandidatos);       

        }

     



    }
}
